Lab 06 - SLAM 3D

Lab. 06 - SLAM 3D

Mapa utworzona lidarslamem

1. Lokalizacja 2D a 3D

Lokalizacja 2D Lokalizacja 3D
  • Działa z tanimi sensorami
  • Wymaga równej powierzchni
  • Trudniejsze wykrycia zamknięcia pętli
  • Stosunkowo prosta mapa 2D
  • Wymaga drogich sensorów
  • Niezależne od środowiska
  • Mapa otoczenia, która może przydać się też do innych celów

Różnice między odometrią, a mapowaniem:

2. Cel zajęć

Celem tych zajęć będzie uruchomienie lokalizacji 3D z wykorzystaniem skanera laserowego dla robota mobilnego.

3. Przygotowanie środowiska

Wersja 1: Obraz (większy rozmiar)

Przed przystąpieniem do pracy należy przygotować środowisko: pobrać obraz dockera i utworzyć na jego podstawie kontener.

Obraz konieczny do wykonywania dzisiejszych zajęć opiera się o osrf/ros:humble-desktop-full, ale zawiera paczki, które są niezbędne do prawidłowego wykonania zadań. Obraz można pobrać z tego linku, lub korzystając z polecenia:

wget --content-disposition --no-check-certificate https://chmura.put.poznan.pl/s/B1td9ifRL1S0js9/download

Pobrany obraz należy wczytać, korzystając z polecenia, podając odpowiednią ścieżkę:

docker load < path/to/file.tar.gz

Następnie można przejść do tworzenia kontenera korzystając ze skryptów przygotowanych dla osób korzystających wyłącznie z CPU lub wyposażonych w GPU Nvidia. Można pobrać odpowiedni skrypt korzystając np. z wget.

Domyślnie kontener nosi nazwę ARM_06. UWAGA! Skrypty po uruchomieniu usuwają kontener o takiej nazwie przed utworzeniem nowego.

Wersja 2: Dockerfile

Plik Dockerfile jest dostępny tutaj. Można go pobrać poleceniem:

wget https://raw.githubusercontent.com/kamilmlodzikowski/LabARM/refs/heads/main/Lab06-SLAM3D/Dockerfile

Skrypt budujący jest dostępny tutaj. Można go pobrać poleceniem:

wget https://raw.githubusercontent.com/kamilmlodzikowski/LabARM/main/Lab06-SLAM3D/arm_06_build.sh

Następnie można przejść do tworzenia kontenera korzystając ze skryptów przygotowanych dla osób korzystających wyłącznie z CPU lub wyposażonych w GPU Nvidia. Można pobrać odpowiedni skrypt korzystając np. z wget.

Domyślnie kontener nosi nazwę ARM_06. UWAGA! Skrypty po uruchomieniu usuwają kontener o takiej nazwie przed utworzeniem nowego.

Korzystanie z kontenera

Po każdym ponownym uruchomieniu komputera (oraz w przypadku problemów z wyświetlaniem aplikacji okienkowych w dockerze), proszę pamiętać o wywoływaniu:

xhost +local:root

Nowy terminal można dołączyć do kontenera korzystając z polecenia:

docker exec -it ARM_06 bash

Konieczne będzie zbudowanie środowiska

cd /arm_ws
source /opt/ros/humble/setup.bash
colcon build --symlink-install

ROS_DOMAIN_ID

W przypadku pracy na komputerze w laboratorium może okazać się konieczne ustawienie ROS_DOMAIN_ID. Domyślnie, ROS2 rozgłasza wszystko innym komputerom w sieci z tym samym ROS_DOMAIN_ID. Wartość tej zmiennej można ustawić korzystając z:

export ROS_DOMAIN_ID = <wybrana_wartość>

Proszę wybrać losową wartość.

Wygodne może być dodanie tego exportu do bashrc:

echo 'export ROS_DOMAIN_ID=<wybrana_wartość>' >> ~/.bashrc 

4. ROS2 Bag

Podczas tych zajęć będziemy wykorzystywać ROS2 Bag. Jest to narzędzie służące do zapisu i odtwarzania danych z wielu topiców ROS2. Jest to pomocne podczas replikowania wyników eksperymentów i testów, a także przydatne podczas udostępniania swojej pracy innym, jako przykład. Popularne jest również wykorzystanie bagów do porównywania działania różnych systemów na tych samych danych.

Nagrywanie bagów

Dane z topiców można zapisać do baga korzystając z polecenia:

ros2 bag record <topic_name1> <topic_name2> [...] <topic_name_n>

np.

ros2 bag record /turtle1/cmd_vel /turtle1/pose

Przerwać nagrywanie można kombinacją klawiszy Ctrl+C.

Możliwe jest również nadanie nazwy baga korzystając z flagi -o, np.:

ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose

W powyższym przypadku topici /turtle1/cmd_vel oraz /turtle1/pose zostaną zapisane do baga o nazwie subset.

Odtwarzanie bagów

Odtworzyć baga można korzystając z polecenia:

ros2 bag play <bag_name>

Wszystkie wiadomości zapisane do baga zostaną odtworzone jednokrotnie, a następnie node publikujący zostanie zatrzymany.

Możliwe jest uruchomienie baga w pętli korzystając z flagi -l. Rozpoczęcie odtwarzania od pauzy wymaga podania flagi -p.

Kontrolę nad tempem odtwarzania baga umożliwia flaga -r i podanie współczynnika, np.: rosbag play -r 0.5 <bag_name> uruchomi odtwarzanie z tempem równym połowie normalnego. Jest to przydatne przy przetwarzaniu skomplikowanym obliczeniowo, jak np. SLAM 3D.

Informacje o bagu

Dane m.in. o topicach zapisanych w bagu można podejrzeć korzystając z polecenia info:

ros2 bag info <bag_name>

Otrzymamy informacje takie jak rozmiar, czas trwania czy topici, które są zapisane.

5. Uruchomienie lidarslam_ros2

W tej instrukcji będziemy wykorzystywać paczkę lidarslam_ros2. Uruchomić system można następującym poleceniem:

cd /arm_ws
source install/setup.bash
ros2 launch lidarslam lidarslam.launch.py

Powinno pojawić się okno rviz2, w którym będzie wizualizowany przebieg lokalizacji i budowy mapy.

HDL_400

Kolejnym krokiem (w osobnym terminalu) będzie odtworzenie baga zawierającego dane zarejestrowane na potrzeby hdl_localization:

ros2 bag play -p -r 0.5 bags/hdl_400

Bag zostanie odtworzony zapauzowany i z rate wynoszącym 0.5 normalnego tempa.

Przed odpauzowaniem proszę jeszcze o dodanie do podglądu danych typu PointCloud2 z topicu /velodyne_points. Zawierają one “aktualne” odczyty z lidara.

Uruchomienie odtwarzania nastąpi po wciśnięciu klawisza spacja z aktywnym terminalem, w którym odtwarzany jest bag.

Proszę zwrócić uwagę na tworzoną mapę z topicu /map i z topicu /modified_map. Czym mogą się różnić? A /path i /modified_path?

Kitti 00

Na potrzeby zajęć zostało przygotowane również 200 pierwszych skanów z sekwencji 00 datasetu Kitti. Dane zawierają również informacje ground truth, które zostaną wykorzystane do (wizualnej) oceny działania systemu.

Przy ponownie uruchomionym lidarslam można uruchomić baga:

ros2 bag play -p bags/kitti

Przed odpauzowaniem proszę jeszcze o dodanie do podglądu danych typu Path z topicu /path_gt_lidar. Sugeruję jeszcze zmienić kolor wizualizowania tych danych dla większej czytelności (inny niż żółty i zielony). Po tym można odpauzować baga.

Prawdopodobnie linia ground truth odbiega od ścieżki zwracanej przez lidarslam. Proszę powtórzyć eksperyment dla -r równego 0.3. Co się dzieje tym razem?

6. Zadanie do samodzielnej realizacji

Analizując dokumentację i kod źródłowy lidarslam oraz obserwując działanie systemu proszę opisać wpływ następujących parametrów z pliku /arm_ws/src/lidarslam_ros2/lidarslam/param/lidarslam.yaml:

  1. ndt_resolution (scan_matcher i graph_based_slam)
  2. trans_for_mapupdate
  3. map_publish_period
  4. scan_period
  5. voxel_leaf_size
  6. loop_detection_period
  7. threshold_loop_closure_score
  8. distance_loop_closure
  9. range_of_searching_loop_closure
  10. search_submap_num

Dodatkowe materiały

  1. 3D Lidar SLAM z zamknięciem pętli.

Autorzy: Michał Nowicki, Kamil Młodzikowski